home *** CD-ROM | disk | FTP | other *** search
- package sun.tools.tree;
-
- import java.util.Hashtable;
- import java.util.Vector;
- import sun.tools.asm.Assembler;
- import sun.tools.java.AmbiguousField;
- import sun.tools.java.ClassDeclaration;
- import sun.tools.java.ClassDefinition;
- import sun.tools.java.ClassNotFound;
- import sun.tools.java.CompilerError;
- import sun.tools.java.Constants;
- import sun.tools.java.Environment;
- import sun.tools.java.FieldDefinition;
- import sun.tools.java.Type;
-
- public class NewInstanceExpression extends NaryExpression {
- FieldDefinition field;
- final int MAXINLINECOST = 30;
-
- public NewInstanceExpression(int var1, Expression var2, Expression[] var3) {
- super(42, var1, Type.tError, var2, var3);
- }
-
- public NewInstanceExpression(int var1, FieldDefinition var2, Expression[] var3) {
- super(42, var1, var2.getType(), (Expression)null, var3);
- this.field = var2;
- }
-
- int precedence() {
- return 100;
- }
-
- public long checkValue(Environment var1, Context var2, long var3, Hashtable var5) {
- Type var6 = super.right.toType(var1, var2);
- super.right = new TypeExpression(super.right.where, var6);
- boolean var7 = var6.isType(13);
- if (!var6.isType(10) && !var7) {
- var1.error(super.where, "invalid.arg.type", var6, Constants.opNames[super.op]);
- var7 = true;
- }
-
- Type[] var8 = new Type[super.args.length];
-
- for(int var9 = 0; var9 < super.args.length; ++var9) {
- var3 = super.args[var9].checkValue(var1, var2, var3, var5);
- var8[var9] = super.args[var9].type;
- var7 = var7 || var8[var9].isType(13);
- }
-
- if (var7) {
- super.type = Type.tError;
- return var3;
- } else {
- ClassDeclaration var10 = var1.getClassDeclaration(var6);
-
- try {
- ClassDefinition var11 = var10.getClassDefinition(var1);
- if (var11.isInterface()) {
- var1.error(super.where, "new.intf", var10);
- return var3;
- }
-
- if (var11.isAbstract(var1)) {
- var1.error(super.where, "new.abstract", var10);
- return var3;
- }
-
- if (!var2.field.getClassDefinition().canAccess(var1, var11.getClassDeclaration())) {
- var1.error(super.where, "cant.access.class", var11);
- return var3;
- }
-
- ClassDefinition var12 = var2.field.getClassDefinition();
- this.field = var11.matchMethod(var1, var12, Constants.idInit, var8);
- if (this.field == null) {
- String var19 = var10.getName().getName().toString();
- var19 = Type.tMethod(Type.tError, var8).typeString(var19, false, false);
- var1.error(super.where, "unmatched.constr", var19, var10);
- return var3;
- }
- } catch (ClassNotFound var14) {
- var1.error(super.where, "class.not.found", var14.name, Constants.opNames[super.op]);
- return var3;
- } catch (AmbiguousField var15) {
- var1.error(super.where, "ambig.constr", var15.field1, var15.field2);
- return var3;
- }
-
- var8 = this.field.getType().getArgumentTypes();
-
- for(int var17 = 0; var17 < super.args.length; ++var17) {
- super.args[var17] = ((Node)this).convert(var1, var2, var8[var17], super.args[var17]);
- }
-
- ClassDeclaration[] var18 = this.field.getExceptions(var1);
-
- for(int var13 = 0; var13 < var18.length; ++var13) {
- if (var5.get(var18[var13]) == null) {
- var5.put(var18[var13], this);
- }
- }
-
- super.type = var6;
- return var3;
- }
- }
-
- public long check(Environment var1, Context var2, long var3, Hashtable var5) {
- return this.checkValue(var1, var2, var3, var5);
- }
-
- Expression inlineNewInstance(Environment var1, Context var2, Statement var3) {
- if (var1.dump()) {
- System.out.println("INLINE NEW INSTANCE " + this.field + " in " + var2.field);
- }
-
- Vector var4 = this.field.getArguments();
- Statement[] var5 = new Statement[var4.size() + 1];
-
- for(int var6 = 0; var6 < super.args.length; ++var6) {
- var5[var6] = new VarDeclarationStatement(super.where, (LocalField)var4.elementAt(var6 + 1), super.args[var6]);
- }
-
- var5[var5.length - 1] = var3 != null ? var3.copyInline(var2, false) : null;
- return (new InlineNewInstanceExpression(super.where, super.type, this.field, new CompoundStatement(super.where, var5))).inline(var1, var2);
- }
-
- public Expression inline(Environment var1, Context var2) {
- return this.inlineValue(var1, var2);
- }
-
- public Expression inlineValue(Environment var1, Context var2) {
- try {
- for(int var3 = 0; var3 < super.args.length; ++var3) {
- super.args[var3] = super.args[var3].inlineValue(var1, var2);
- }
-
- return this;
- } catch (ClassNotFound var4) {
- throw new CompilerError(var4);
- }
- }
-
- public void code(Environment var1, Context var2, Assembler var3) {
- var3.add(super.where, 187, this.field.getClassDeclaration());
-
- for(int var4 = 0; var4 < super.args.length; ++var4) {
- super.args[var4].codeValue(var1, var2, var3);
- }
-
- var3.add(super.where, 183, this.field);
- }
-
- public void codeValue(Environment var1, Context var2, Assembler var3) {
- var3.add(super.where, 187, this.field.getClassDeclaration());
- var3.add(super.where, 89);
-
- for(int var4 = 0; var4 < super.args.length; ++var4) {
- super.args[var4].codeValue(var1, var2, var3);
- }
-
- var3.add(super.where, 183, this.field);
- }
- }
-